(function () {
    "use strict";

    angular.module('core').factory('produtoService', factory);
    factory.$inject = ['$http', '$q'];

    function factory($http, $q) {

        var _get = function (id) {
            var deferred = $q.defer();
            $http.post('/produto/get', id)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _getAll = function (args) {
            var deferred = $q.defer();
            $http.post('/produto/getall', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _GetByCode = function (codigo) {
            var deferred = $q.defer();
            var args = {codigo: codigo}
            $http.post('/produto/GetByCode', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _count = function (args) {
            var deferred = $q.defer();
            $http.post('/produto/count', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _prepareNew = function () {
            var deferred = $q.defer();
            $http.post('/produto/prepareNew')
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepare = function (item) {
            var deferred = $q.defer();
            $http.post('/produto/prepare', item)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepareNewVariante = function (item) {
            var deferred = $q.defer();
            $http.post('/produto/prepareNewVariante', item)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _generateCodigoBarra = function (item) {
            var deferred = $q.defer();
            $http.post('/produto/generateCodigoBarra', item)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepareNewPrecoProduto = function (item) {
            var deferred = $q.defer();
            $http.post('/produto/prepareNewPrecoProduto', item)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepareNewMidia = function (item) {
            var deferred = $q.defer();
            $http.post('/produto/prepareNewMidia', item)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepareNewCodigoBarra = function (item) {
            var deferred = $q.defer();
            $http.post('/produto/prepareNewCodigoBarra', item)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepareNewSimilar = function (item, codigoProdutoSimilar) {
            var deferred = $q.defer();
            var args = {
                item: item,
                codigoProdutoSimilar: codigoProdutoSimilar,
            };
            $http.post('/produto/prepareNewSimilar', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepareNewCombinado = function (item, codigoProdutoCombinado) {
            var deferred = $q.defer();
            var args = {
                item: item,
                codigoProdutoCombinado: codigoProdutoCombinado,
            };
            $http.post('/produto/prepareNewCombinado', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _save = function (item) {
            var deferred = $q.defer();
            $http.post('/produto/save', item)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _delete = function (id) {
            var args = { id: id };
            var deferred = $q.defer();
            $http.post('/produto/delete', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        return {
            get: _get,
            getAll: _getAll,
            count: _count,
            prepareNew: _prepareNew,
            prepare: _prepare,
            prepareNewVariante: _prepareNewVariante,
            prepareNewPrecoProduto: _prepareNewPrecoProduto,
            prepareNewMidia: _prepareNewMidia,
            prepareNewCodigoBarra: _prepareNewCodigoBarra,
            prepareNewSimilar: _prepareNewSimilar,
            prepareNewCombinado: _prepareNewCombinado,
            save: _save,
            generateCodigoBarra: _generateCodigoBarra,
            GetByCode: _GetByCode,
            delete: _delete
        };
    }

})();


